package org.spring.demo.web;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.slf4j.LoggerFactory;
import org.spring.demo.entity.Building;
import org.spring.demo.entity.City;
import org.spring.demo.entity.SysUser;
import org.spring.demo.service.SysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/test")
public class TestController {
	private static final org.slf4j.Logger logger = LoggerFactory.getLogger(TestController.class);
	
	@Value("${address}")  
    private String ftpAddress;
	@Autowired
	private SysUserService sysUserService;
	@RequestMapping("/page")
	public String test(HttpServletRequest request){
		logger.info("日志记录开始------》：{}",request);
		String flag = request.getParameter("flag");
		try {
			SysUser user = sysUserService.add(flag);
			request.setAttribute("user", user);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "page";
	}
	


	@RequestMapping("/excel")
    public String download(HttpServletRequest request,HttpServletResponse response) throws IOException{
        String fileName=(request.getParameter("flag").equals("1"))?"城市数据统计":"行政区数据统计";
        fileName=fileName+new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
        //填充数据
        ByteArrayOutputStream os = new ByteArrayOutputStream();
            List<City> listSalesReportVo= sysUserService.getAllCityList();
            List<Map<String,Object>> list =createExcelRecord(listSalesReportVo);
            String columnNames[]={"统计类型","id","名称","拼音","其他名称"};//列名
            String keys[] = {"type","Id","name","pinyin","otherName"};//map中的key
            try {
                createWorkBook(list,keys,columnNames).write(os);
            } catch (IOException e) {
                e.printStackTrace();
            }
        byte[] content = os.toByteArray();
        InputStream is = new ByteArrayInputStream(content);
     // 设置response参数，可以打开下载页面
        response.reset();
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        response.setHeader("Content-Disposition", "attachment;filename="+ new String((fileName + ".xls").getBytes(), "iso-8859-1"));
        ServletOutputStream out = response.getOutputStream();
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            bis = new BufferedInputStream(is);
            bos = new BufferedOutputStream(out);
            byte[] buff = new byte[2048];
            int bytesRead;
            // Simple read/write loop.
            while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
                bos.write(buff, 0, bytesRead);
            }
        } catch (final IOException e) {
            throw e;
        } finally {
            if (bis != null)
                bis.close();
            if (bos != null)
                bos.close();
        }
        return null;
    }
  
  private List<Map<String, Object>> createExcelRecord(List<City> listSalesReport) {
         List<Map<String, Object>> listmap = new ArrayList<Map<String, Object>>();
         Map<String, Object> map = new HashMap<String, Object>();
         map.put("sheetName", "数据统计");
         listmap.add(map);
         City salesReport=null;
         for (int j = 0; j < listSalesReport.size(); j++) {
             salesReport=listSalesReport.get(j);
             Map<String, Object> mapValue = new HashMap<String, Object>();
             mapValue.put("type", salesReport.getType());
             mapValue.put("Id", salesReport.getId());
             mapValue.put("name", salesReport.getName());
             mapValue.put("pinyin", salesReport.getPinyin());
             mapValue.put("otherName", salesReport.getOtherName());
             listmap.add(mapValue);
         }
         return listmap;
     }


     /**
      * 创建excel文档，
      * @param keys list中map的key数组集合
      * @param columnNames excel的列名
      * */
     public static Workbook createWorkBook(List<Map<String, Object>> list,String []keys,String columnNames[]) {
         // 创建excel工作簿
         Workbook wb = new HSSFWorkbook();
         // 创建第一个sheet（页），并命名
         Sheet sheet = wb.createSheet(list.get(0).get("sheetName").toString());
         // 手动设置列宽。第一个参数表示要为第几列设；，第二个参数表示列的宽度，n为列高的像素数。
         for(int i=0;i<keys.length;i++){
             sheet.setColumnWidth((short) i, (short) (35.7 * 150));
         }

         // 创建第一行
         Row row = sheet.createRow((short) 0);

         // 创建两种单元格格式
         CellStyle cs = wb.createCellStyle();
         CellStyle cs2 = wb.createCellStyle();

         // 创建两种字体
         Font f = wb.createFont();
         Font f2 = wb.createFont();

         // 创建第一种字体样式（用于列名）
         f.setFontHeightInPoints((short) 10);
         f.setColor(IndexedColors.BLACK.getIndex());
         f.setBoldweight(Font.BOLDWEIGHT_BOLD);

         // 创建第二种字体样式（用于值）
         f2.setFontHeightInPoints((short) 10);
         f2.setColor(IndexedColors.BLACK.getIndex());

//         Font f3=wb.createFont();
//         f3.setFontHeightInPoints((short) 10);
//         f3.setColor(IndexedColors.RED.getIndex());

         // 设置第一种单元格的样式（用于列名）
         cs.setFont(f);
         cs.setBorderLeft(CellStyle.BORDER_THIN);
         cs.setBorderRight(CellStyle.BORDER_THIN);
         cs.setBorderTop(CellStyle.BORDER_THIN);
         cs.setBorderBottom(CellStyle.BORDER_THIN);
         cs.setAlignment(CellStyle.ALIGN_CENTER);

         // 设置第二种单元格的样式（用于值）
         cs2.setFont(f2);
         cs2.setBorderLeft(CellStyle.BORDER_THIN);
         cs2.setBorderRight(CellStyle.BORDER_THIN);
         cs2.setBorderTop(CellStyle.BORDER_THIN);
         cs2.setBorderBottom(CellStyle.BORDER_THIN);
         cs2.setAlignment(CellStyle.ALIGN_CENTER);
         //设置列名
         for(int i=0;i<columnNames.length;i++){
             Cell cell = row.createCell(i);
             cell.setCellValue(columnNames[i]);
             cell.setCellStyle(cs);
         }
         //设置每行每列的值
         for (short i = 1; i < list.size(); i++) {
             // Row 行,Cell 方格 , Row 和 Cell 都是从0开始计数的
             // 创建一行，在页sheet上
             Row row1 = sheet.createRow((short) i);
             // 在row行上创建一个方格
             for(short j=0;j<keys.length;j++){
                 Cell cell = row1.createCell(j);
                 cell.setCellValue(list.get(i).get(keys[j]) == null?" ": list.get(i).get(keys[j]).toString());
                 cell.setCellStyle(cs2);
             }
         }
         return wb;
     }

     @Resource
     private ResourceLoader resourceLoader;
     @RequestMapping("file")
     void download(String path, HttpServletResponse response, HttpServletRequest request) {
         InputStream inputStream = null;
         OutputStream  servletOutputStream =null;
         try {
             // 下载保存的文件名
             String filename = "视频文件下载.mp4";
             org.springframework.core.io.Resource resource = resourceLoader.getResource("classpath:1.mp4");
             // Excel 下载
             // response.setContentType("application/vnd.ms-excel");
             // 文件视频下载
             response.setContentType("application/octet-stream");
             response.addHeader("Cache-Control", "no-cache, no-store, must-revalidate");
             response.addHeader("charset", "utf-8");
             response.addHeader("Pragma", "no-cache");
             String encodeName = URLEncoder.encode(filename, StandardCharsets.UTF_8.toString());
             response.setHeader("Content-Disposition", "attachment; filename=\"" + encodeName + "\"; filename*=utf-8''" + encodeName);
             inputStream = resource.getInputStream();
             servletOutputStream = response.getOutputStream();
             IOUtils.copy(inputStream, servletOutputStream);
             response.flushBuffer();
         } catch (Exception e) {
         } finally {
             try {
                 if (servletOutputStream != null) {
                     servletOutputStream.close();
                 }
                 if (inputStream != null) {
                     inputStream.close();
                 }
                 // 召唤jvm的垃圾回收器
                 System.gc();
             } catch (Exception e) {
                 e.printStackTrace();
             }
         }
     }
}
